package com.frejoys.service;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.frejoys.common.dto.admin.*;
import com.frejoys.common.dto.app.CategoryPidDto;
import com.frejoys.common.dto.app.CategorySiteDto;
import com.frejoys.common.dto.common.IdDto;
import com.frejoys.common.dto.store.CategoryListDto;
import com.frejoys.common.vo.admin.AdminCategoryInfoVo;
import com.frejoys.common.vo.admin.AdminCategoryPageVo;
import com.frejoys.common.vo.admin.CategorySelectVo;
import com.frejoys.common.vo.app.CategoryListVo;
import com.frejoys.common.vo.app.CategorySonListVo;
import com.frejoys.dao.entity.Category;

import java.util.List;
import java.util.Map;

public interface CategoryService extends IService<Category> {

    default Category getOnly(QueryWrapper<Category> wrapper) {
        wrapper.last("limit 1");
        return this.getOne(wrapper);
    }

    default Category getOnly(LambdaQueryWrapper<Category> wrapper) {
        wrapper.last("limit 1");
        return this.getOne(wrapper);
    }



    /**
     * 获取所有品类,不包括隐藏的
     */
    List<Category> listInfo();


    /**
     * 获取所有品类,包括隐藏的
     */
    List<Category> listAll();


    /**
     * 商家端获取品类选择列表,根据等级及sort排序
     */
    List<CategorySelectVo> getSelectVo(List<Category> list, CategoryListDto dto);


    /**
     * 设置品类前缀
     */
    void setNamePrefix(List<Category> categoryList);

    /**
     *
     * 根据指定的分类,组装对应子类,并按照层级及sort字段排序
     */
    void fillData(List<Category> list, List<Category> topList, List<Category> result);


    /**
     * 品类排序,根据层级和sort字段
     */
    void sortCategory(List<Category> list);

    /** 首页菜单品类列表 大类
     *
     * @param dto
     * @param list
     * @return
     */
    List<CategoryListVo> onCategory(CategorySiteDto dto,List<Category> list);


    /** 根据品类id查询子集 包含父级本身品类
     *
     * @param dto
     * @param categoryList
     * @return
     */
    List<CategoryListVo> categoryListInfo(CategoryPidDto dto,List<Category> categoryList);

    //根据品类id查询子集品类
    List<CategoryListVo> sonListInfo(CategoryPidDto dto,List<Category> categoryList);


    /** 全部类型 树型结构
     *
     * @param dto
     * @param list
     * @return
     */
    List<CategorySonListVo> categoryAndSon(CategorySiteDto dto,List<Category> list);




    boolean addInfo(CategoryAddDto dto);
    boolean upInfo(CategoryUpDto dto);
    boolean delInfo(DelIdDto dto);

    /**
     * 获取品类的id及名称,用于vo填充
     */
    Map<Integer,String> getIdNameMap();
    Map<Integer,String> getIdNameMap(List<Integer> ids);

    List<CategorySelectVo> getSelectVo_old(CategoryListDto dto);

    /**
     * 根据店铺id获取店铺新增商品时能够选择的品类
     * @param dto 店铺id
     */
    List<CategoryListVo> listChildCategory(IdDto dto);

    void test();

    /**
     * 后台查询品类列表
     */
    IPage<AdminCategoryPageVo> pageCategory(CategoryPageDto dto);

    /**
     * 后台查询类目详情
     */
    AdminCategoryInfoVo getInfo(IdDto dto);

    /**
     * 后台修改类目排序
     */
    boolean changeSort(CategoryChangeSortDto dto);

    //全部分类
    List<CategoryListVo> categoryAll(List<Category> categories);

}
